///////////////////////////////////////////////////////////////////////////////
// File:        CircleBuffer.hpp
// Author:      671643387@qq.com
// Description: 
///////////////////////////////////////////////////////////////////////////////

#if !defined(SHARED_UTIL_CIRCLEBUFFER_HPP_)
#define SHARED_UTIL_CIRCLEBUFFER_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include <memory.h>
#include <cstddef>
#include <boost/noncopyable.hpp>

///////////////////////////////////////////////////////////////////////////////

template<std::size_t SIZE>
class CircleBuffer : public boost::noncopyable
{
public:
    ///////////////////////////////////////////////////////////////////////////
    CircleBuffer(void);
    ~CircleBuffer(void);

public:
    ///////////////////////////////////////////////////////////////////////////
    std::size_t capacity(void) const { return SIZE; }
    std::size_t size(void) const { return size_; }
    std::size_t space(void) const { return SIZE - size_; }

    std::size_t read(char* buf, std::size_t len);
    std::size_t peek(char* buf, std::size_t len);
    std::size_t skip(std::size_t len);
    std::size_t write(const char* buf, std::size_t len);

private:
    ///////////////////////////////////////////////////////////////////////////
    char        buf_[SIZE];
    std::size_t size_;
    std::size_t rpos_;
    std::size_t wpos_;
};

#include "util/CircleBuffer.inl"

#endif //SHARED_UTIL_CIRCLEBUFFER_HPP_
